/**
 *
 * 功能：
 * 1:根据指定的TileSize(拼块地图的大小)，map_vertex[][]=高度信息,
 * 2:根据(x,z)得到y
 * 保存每个三角面Ax+By+Cz+D=0的公式，其实保存的是由x，z求出y的所需的信息
 * 根据任意大小的map[][]生成一张地图
 * 为了简便起见，先把把每个地图小快当成方格处理，从网上看到的魔兽3的3D地图也是拼块
 */
 package kgame5.k3d.util3d {

public class Terrain {

  //_______________________________Property_________________________________________
  //----------------------模型信息-----------------------
//  private var md:Model3D;
//
//  private var TileRC:int, TileCC:int; //地图块的行数、列数
//  private var TileSize:Number; //地图块的尺寸，和障碍物信息组合使用可以得到碰撞区域
//
//	//--------------------障碍物信息--------------------------
// 
//  //----------------------外观信息-----------------------
//
//  //----------------------几何信息-----------------------
//  /**
//   * ……它是在以另一种方式存储地图的高度信息，存储的是每个点(x,z)的高度，当然要用特殊方式读取：getAlititude(x,z);
//   * 每个地图块的三角平面的由(x,z)求y的信息，
//   * 每组6个，
//   * 上三角面求公式的信息：[组索引+0]=-A/B,[组索引+1]=-C/B,[组索引+2]=-D/B
//   * 上三角面求公式的信息：[组索引+3]=-A/B,[组索引+4]=-C/B,[组索引+5]=-D/B
//   *
//   * 使用一维数组是为了提速，因为边界检查，当地图上很多精灵都在执行计算高度函数时,三维数组是需要大量的边界检查的
//   */
//  private var aFormulaData:Array = null;
//  
//
//  //__________________________________Method______________________________________________
// 
// 
//  public function Terrain(
//      a2HeightMap:Array, //地形起伏的顶点信息,地图高度表,地图的面片是由这个生成的
//       p_TileSize:Number, //地图块的真实大小，后面的两个数组都是使用它作为单元格大小的
//       bitmap:BitmapData
//      ) {
//    //注意参数中站主导地位的还是Bar[][],东西要以他为准的
//    //------------------------得到常数信息----------------------------------------
//    TileSize = p_TileSize; //真实的每个地图块的大小
//    TileCC = a2HeightMap[0].length-1;
//    TileRC = a2HeightMap.length-1;
//	
//	//--在地图上显示出格子
//	/*
//	for(var r:int=0;r<TileRC;r++){
//		for(var c:int=0;c<TileCC;c++){
//			bitmap.fillRect(
//					new Rectangle(c*TileSize,r*TileSize, TileSize,TileSize),
//					MathDG.random(0,5)*50);
//		}
//	}
//	//*/
//    //--------------------------------障碍物信息-----------------------------------
//   
//
//    //--------------------------生成三角面公式信息----------------------------------
//    makeTrianglePlaneFormulaData(a2HeightMap, p_TileSize);
//
//    //---------------------------生成模型---------------------------------------
//	md=Factory3D.CreateModel_TextureMesh_XOZ(TileCC,TileRC,TileSize,
//		bitmap,
//		a2HeightMap,true);
//
//  }
//	
////////////////////////////////////////////////////////////
//  //得到地图块大小
//  public function  getTileSize():Number {
//    return TileSize;
//  }
//
//  //得到行数
//  public function getRC():int {
//    return TileRC;
//  }
//
////得到列数
//  public function  getCC():int {
//    return TileCC;
//  }
//
//  //返回模型 //！出现过的问题是把public Mesh改成public Node之后需要重新编译才行
//  public function getModel():Model3D {
//    return md;
//  }
//
////------------------------
//  //得到地图的高度
//  public function getAltitude( x:Number, z:Number):Number {
//    if (aFormulaData == null) { //如果没有生成地图的三角面公式信息,则不能取得高度，高度为0
//      return 0;
//    }
//    var cellX :int= Math.floor(x / TileSize);
//    var cellZ:int = Math.floor(-z / TileSize);
//    //--------------------数组越界保护---------------------
//    if (cellX > TileCC - 1 || cellZ > TileRC - 1 || cellX < 0 || cellZ < 0) {
//      return 0;
//    }
//
//    //--------------------计算高度------------------------
//    var index:int = (cellZ * TileCC + cellX) * 6;//在方程式里的索引号
//
//    if (x % TileSize + (-z) % TileSize < TileSize) { //！！注意具体问题具体分析.计算在哪个三角面上，具体问题具体分析，不能生搬硬套啊！！以前是(x % gridsize +z % gridsize>gridsize)
//      return aFormulaData[index + 0] * x +
//          aFormulaData[index + 1] * z +
//          aFormulaData[index + 2];
//    } else { //在下三角面
//      return aFormulaData[index + 3] * x +
//          aFormulaData[index + 4] * z +
//          aFormulaData[index + 5];
//    }
//  }
//
//  //=======================================私有函数=================================================
//  private function makeTrianglePlaneFormulaData( map_vertex:Array,  p_TileSize:Number) {
//    /**
//     * 就是描述每个三角面的公式np+D=0;我存储的是Ax+By+Cz+D=0; 根据这些就可以得出高度了
//     */
//
//    aFormulaData = new Array(TileRC * TileCC * 6);
//
//    //三角面的公式的系数
//    var n:Vector3D = new Vector3D();
//    var D :Number= 0;
//
//    var temp_a:Vector3D = new Vector3D();
//    var temp_b:Vector3D = new Vector3D();
//    
//    var temp_p1:Vector3D = new Vector3D(); 
//    var temp_p2:Vector3D = new Vector3D();
//    var temp_p3:Vector3D = new Vector3D();
//
//    for (var r:int = 0; r < TileRC; r++) {
//      for (var c:int = 0; c < TileCC; c++) {
//
//        //-------------------数组越界进行处理（开发阶段使用这种处理）-----------------------------
//
//        //--------------------------计算自己是在哪个三角面上----------------------------
//        var startIndex:int = (r * TileCC + c) * 6; //现在的点在TrianglePlaneFormulaInfo_best[]的起始位置
//
//        //---计算上三角面---
//        //AB
//        //C
//        //获得三个点的位置
//        temp_p1.fill(c * TileSize, map_vertex[r][c], -r * TileSize);
//        temp_p2.fill( (c + 1) * TileSize, map_vertex[r][c + 1], -r * TileSize);
//        temp_p3.fill(c * TileSize, map_vertex[r + 1][c], -(r + 1) * TileSize);
//		
//		Vector3D.SSub(temp_p3,temp_p1,temp_a);
//		Vector3D.SSub(temp_p2,temp_p1,temp_b);
//		//temp_a = temp_p3.sub(temp_p1);
//        //temp_b = temp_p2.sub(temp_p1);
//
//        //求n
//       // n = temp_a.OuterProduct(temp_b); //！注意顺序，因为这决定乘积法线的方向
//        Vector3D.SOuterProduct(temp_a,temp_b,n);
//        n.normalize();
//        //求D
//        D = -n.innerProduct(temp_p1);
//
//        //设置三角面信息
//        aFormulaData[startIndex + 0] = -n.x / n.y; //-A/B
//        aFormulaData[startIndex + 1] = -n.z / n.y; //-C/B
//        aFormulaData[startIndex + 2] = -D / n.y; //-D/B
//
//        //---在下三角面----
//        // B
//        //CD
//        temp_p3.fill( (c + 1) * TileSize, map_vertex[r][c + 1], -r * TileSize);
//        temp_p2.fill(c * TileSize, map_vertex[r + 1][c], -(r + 1) * TileSize);
//        temp_p1.fill( (c + 1) * TileSize, map_vertex[r + 1][c + 1], -(r + 1) * TileSize);
//
//        //temp_a = temp_p3.sub(temp_p1);
//        //temp_b = temp_p2.sub(temp_p1);
//		Vector3D.SSub(temp_p3,temp_p1,temp_a);
//		Vector3D.SSub(temp_p2,temp_p1,temp_b);
//		
//        //求n
//        //n = temp_a.OuterProduct(temp_b); //操几吧注意顺序，因为这决定乘积法线的方向
//         Vector3D.SOuterProduct(temp_a,temp_b,n);
//        n.normalize();
//        //求D
//        D = -n.innerProduct(temp_p1);
//
//        //设置三角面信息
//        //best
//        aFormulaData[startIndex + 3] = -n.x / n.y; //-A/B
//        aFormulaData[startIndex + 4] = -n.z / n.y; //-C/B
//        aFormulaData[startIndex + 5] = -D / n.y; //-D/B
//      }
//    }
//
//  }
} // end of Class
 }